package com.xu.tools.minio;

import io.minio.Result;
import io.minio.messages.Bucket;
import io.minio.messages.Item;

import java.io.InputStream;
import java.util.List;

/**
 * @author xuguan
 * @date 2023/2/16
 * @desc minio 操作
 */
public interface MinioService {

    /**
     * 获取所有桶集合
     */
    List<Bucket> listBuckets();

    /**
     * 检查桶是否存在
     *
     * @param bucket 桶
     * @return boolean
     */
    boolean bucketExists(String bucket);

    /**
     * 创建桶
     *
     * @param bucket 桶
     */
    void makeBucket(String bucket);

    /**
     * 删除桶
     *
     * @param bucket 桶
     */
    void removeBucket(String bucket);

    /**
     * 获取桶中所有文件
     *
     * @param bucket 桶
     * @return 所有文件
     */
    Iterable<Result<Item>> listObject(String bucket);

    /**
     * 获取文件
     *
     * @param bucket     桶
     * @param objectName 文件
     * @return 文件输入流
     */
    InputStream getObject(String bucket, String objectName);

    /**
     * 判断文件是否存在
     *
     * @param bucket     桶
     * @param objectName 文件
     * @return 布尔值 true:存在 false:不存在
     */
    boolean objectExists(String bucket, String objectName);

    /**
     * 获取文件预览url
     *
     * @param bucket     桶
     * @param objectName 文件
     * @return 文件预览url
     */
    String getPreSignedObjectUrl(String bucket, String objectName);

    /**
     * 上传文件
     *
     * @param fileName    上传文件路径
     * @param contentType contentType
     * @param bucket      桶
     * @param objectName  文件
     */
    void uploadObject(String fileName, String contentType, String bucket, String objectName);

    /**
     * 上传文件
     *
     * @param uploadFileBytes 上传文件转化后的字节数组
     * @param contentType     contentType
     * @param bucket          桶
     * @param objectName      文件
     * @return 文件预览url
     */
    void uploadObject(byte[] uploadFileBytes, String contentType, String bucket, String objectName);

    /**
     * 下载文件
     *
     * @param bucket           桶
     * @param objectName       文件
     * @param downloadFileName 下载完成后的文件
     */
    void downloadObject(String bucket, String objectName, String downloadFileName);

    /**
     * 删除文件
     *
     * @param bucket     桶
     * @param objectName 文件
     */
    void removeObject(String bucket, String objectName);
}
